package com.cskaoyan.day24.udp;

import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.SocketAddress;
import java.net.UnknownHostException;

/**
 * UDP网络编程工具类,主要包含以下功能的实现:
 *     1.发送端构建传输数据的数据包时，基本的代码形式是一致的。
 *     2.接收端接收传输的数据包时，基本的代码形式也是一致的。
 *     3.接收端解析接收到的消息时，基本的代码形式也是一致的。
 * 以上功能都是可以封装成一个工具方法的
 *
 * @since 10:59
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class UDPUtils {
    private UDPUtils() {
    }

    // 获取发送端发送的数据报包,需要的参数有: IP地址和端口号,要发送的消息
    public static DatagramPacket getSendPacket(String msg, String ip, int port) throws UnknownHostException {
        // 构造数据报包，用来将长度为length偏移量为offset的包发送到指定主机上的指定端口号。
        // DatagramPacket(byte[] buf,  int offset, int length, InetAddress address, int port)
        // 1.将要发送的消息msg转换成byte数组
        byte[] bytes = msg.getBytes();
        // 2.将字符串IP地址,转换成InetAddress类型
        // 获取一个指定ip地址的InetAddress对象
        // InetAddress address2 = InetAddress.getByName("ip地址");
        InetAddress netIp = InetAddress.getByName(ip);
        // 3.创建DatagramPacket,然后直接返回
        return new DatagramPacket(bytes, 0, bytes.length, netIp, port);
    }

    // 获取接收端用于接收发送端数据报包的,空的数据报包
    public static DatagramPacket getReceivePacket() {
        // 构造 DatagramPacket，用来接收长度为length的包，在缓冲区中指定了偏移量。
        // DatagramPacket(byte[] buf, int offset, int length)
        // 先创建一个空的byte数组,然后直接创建一个空的数据报包,直接返回该对象
        return new DatagramPacket(new byte[1024], 0, 1024);
    }

    // 用于解析接收端接收到的发送端发送的数据报包
    public static void parseSendData(DatagramPacket packet) {
        // 实现: 打印发送端的IP地址和端口,以及打印发送端发送的消息
        // DatagramPacket的成员方法
        // 返回数据缓冲区，即数据包封装的字节数据
        // byte[] getData()
        // 返回将要发送或接收到的数据的长度。
        // int getLength()
        // 解析一下发送端发送的消息
        // 返回将要发送或接收到的数据的偏移量。
        // int getOffset()
        byte[] data = packet.getData();
        int offset = packet.getOffset();
        int length = packet.getLength();
        String msg = new String(data, offset, length);

        // 获取数据包（要发送到的或者发送者）的IP地址和端口号
        // SocketAddress getSocketAddress()
        SocketAddress socketAddress = packet.getSocketAddress();
        System.out.println("来自于发送端:" + socketAddress + ", 他发送的消息是:" + msg);
    }
}
